package com.gitee.mrj.aiboot.annotation.config.sf.ui.widget;

import com.gitee.mrj.aiboot.annotation.config.KV;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
public @interface SFCascaderWidget {

    /**
     * 在文字框中显示提示讯息
     */
    String placeholder() default "";

    /**
     * 是否支持搜索，默认：`false`
     */
    boolean showSearch() default false;

    /**
     * 是否显示清除按钮，默认：`true`
     */
    boolean allowClear() default true;

    /**
     * 清除按钮的标题，默认：`清除`
     */
    String clearText() default "";

    /**
     * 是否显示箭头，默认：`true`
     */
    boolean showArrow() default true;

    /**
     * 是否显示箭头，默认：`true`
     */
    boolean showInput() default true;

    /**
     * 自定义浮层类名
     */
    String menuClassName() default "";

    /**
     * 自定义浮层样式
     */
    KV[] menuStyle() default {};

    /**
     * 当下拉列表为空时显示的内容
     */
    String notFoundContent() default "";

    /**
     * 弹出菜单中数据列的自定义样式
     */
    String columnClassName() default "";

    /**
     * 是否缓存异步加载的数据，若每次异步加载的数据都是变化的，需将该值设置为 `false`，默认：`true`
     */
    boolean enableCache() default true;

    /**
     * 次级菜单的展开方式，默认：`click`
     */
    TriggerAction expandTrigger() default TriggerAction.CLICK;

    /**
     * 当此项为 `true` 时，点选每级菜单选项值都会发生变化，具体见上面的演示，默认：`false`
     */
    boolean changeOnSelect() default false;

    /**
     * 触发菜单出现的行为，默认：`['click']`
     */
    TriggerAction[] triggerAction() default {};

    /**
     * 值 `value` 的属性名称，默认：`value`
     */
    String valueProperty() default "";

    /**
     * 值 `label` 的属性名称，默认：`label`
     */
    String labelProperty() default "";

    public enum TriggerAction {
        CLICK("click"),
        HOVER("hover");

        private final String type;

        TriggerAction(String hover) {
            this.type = hover;
        }

        public String type() {
            return this.type;
        }
    }
}
